package demo2;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * DAO数据连接对象 Data Access Object
 * 是以后项目分层后的产物
 * 将来有一些类专门用于与数据库打交道的，这些类被称为DAO
 * 后面详细说
 * @PropertySource注解是Spring框架提供的
 * 用于告知Spring容器，当前类需要加载一个配置文件，使用配置文件中的内容做初始化
 * 其中该注解的参数就是用来指明配置文件的位置
 * "classpath"用于告知Spring容器从类加载路径下开始寻找
 * 在Maven项目中，约定：
 * src作为存放项目源程序的路径，下面分为两个目录
 * main/java：存放所有的.java源代码文件
 * main/resources：存放所有其他资源文件
 *
 * 当Maven项目编译后，会将：
 * main/java和main/resources合并存档到target/classes目录下
 * 并且在JVM执行当前项目中某个类时，Maven项目会明知类加载路径为：
 * target/classes
 * 我们将当前类所需要的配置文件:config.properties放在了main/resources
 *     下,那么编译后,该文件就被保存在target/classes下.而这里也就是类加载路径
 *     因此我们可以在@PropertySource("classpath:")表明从类加载路径下开始寻找
 *     对应的config.properties,所以最终该注解的写法如下:
 *     @PropertySource("classpath:config.properties")
 */
@Component
@PropertySource("classpath:config.properties")
public class UserDAO {
    //Value注解是Spring框架提供的，用于为属性值进行初始化的
    //当Spring框架在创建当前UserDAO实例时会用@Value注解为属性赋值
    /*
    在@Value注解中有两种方法：
    1.直接将值指定，实际开发并不推荐这样的写法，因为不灵活
    2.引用外部的资源文件(@PropertySource注解指明配置文件的位置)
    ${}中书写properties文件中的name,那么Spring框架会将该文件中这个name对应的value
          初始化对应的属性

          例如:
          config.properties文件内容:
          spring.datasource.url=jdbc:mysql://localhost:3360/blog
          spring.datasource.username=root
          spring.datasource.password=root

          那么:
          @Value("${spring.datasource.url}")
          private String url;

          Spring容器在初始化当前UserDAO时,会将配置文件中"spring.datasource.url"对应
          的值"jdbc:mysql://localhost:3360/blog"来初始化url这个属性

          实际开发中,当我们在一个类中需要使用一个值,而这个值可能随着实际应用业务的变化而改变时
          那么这个值就不应当写死在程序中,而是像现在演示的一样用配置文件进行配置,以避免因为变化
          带来的源代码修改(这会导致实际生产环境中只能重新编译代码重新部署,增加维护成本和复杂度)
     */
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Override
    public String toString() {
        return "UserDAO{" +
                "url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
